home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / xdg-mime < prev    next >
Text File  |  2009-02-09  |  28KB  |  1,103 lines

  1. #!/bin/sh
  2. #---------------------------------------------
  3. #   xdg-mime
  4. #
  5. #   Utility script to manipulate MIME related information
  6. #   on XDG compliant systems.
  7. #
  8. #   Refer to the usage() function below for usage.
  9. #
  10. #   Copyright 2006, Kevin Krammer <kevin.krammer@gmx.at>
  11. #   Copyright 2006, Jeremy White <jwhite@codeweavers.com>
  12. #
  13. #   LICENSE:
  14. #
  15. #   Permission is hereby granted, free of charge, to any person obtaining a
  16. #   copy of this software and associated documentation files (the "Software"),
  17. #   to deal in the Software without restriction, including without limitation
  18. #   the rights to use, copy, modify, merge, publish, distribute, sublicense,
  19. #   and/or sell copies of the Software, and to permit persons to whom the
  20. #   Software is furnished to do so, subject to the following conditions:
  21. #
  22. #   The above copyright notice and this permission notice shall be included
  23. #   in all copies or substantial portions of the Software.
  24. #
  25. #   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  26. #   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  27. #   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  28. #   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  29. #   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  30. #   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  31. #   OTHER DEALINGS IN THE SOFTWARE.
  32. #
  33. #---------------------------------------------
  34.  
  35. manualpage()
  36. {
  37. cat << _MANUALPAGE
  38. Name
  39.  
  40. xdg-mime - command line tool for querying information about file type handling
  41. and adding descriptions for new file types
  42.  
  43. Synopsis
  44.  
  45. xdg-mime query { filetype | default } ...
  46.  
  47. xdg-mime default application mimetype(s)
  48.  
  49. xdg-mime install [--mode mode] [--novendor] mimetypes-file
  50.  
  51. xdg-mime uninstall [--mode mode] mimetypes-file
  52.  
  53. xdg-mime { --help | --manual | --version }
  54.  
  55. Description
  56.  
  57. The xdg-mime program can be used to query information about file types and to
  58. add descriptions for new file types.
  59.  
  60. Commands
  61.  
  62. query
  63.  
  64.     Returns information related to file types.
  65.  
  66.     The query option is for use inside a desktop session only. It is not
  67.     recommended to use xdg-mime query as root.
  68.  
  69.     The following queries are supported:
  70.  
  71.     query filetype FILE: Returns the file type of FILE in the form of a MIME
  72.     type.
  73.  
  74.     query default mimetype: Returns the default application that the desktop
  75.     environment uses for opening files of type mimetype. The default
  76.     application is identified by its *.desktop file.
  77.  
  78. default
  79.  
  80.     Ask the desktop environment to make application the default application for
  81.     opening files of type mimetype. An application can be made the default for
  82.     several file types by specifying multiple mimetypes.
  83.  
  84.     application is the desktop file id of the application and has the form
  85.     vendor-name.desktop application must already be installed in the desktop
  86.     menu before it can be made the default handler. The aplication's desktop
  87.     file must list support for all the MIME types that it wishes to be the
  88.     default handler for.
  89.  
  90.     Requests to make an application a default handler may be subject to system
  91.     policy or approval by the end-user. xdg-mime query can be used to verify
  92.     whether an application is the actual default handler for a specific file
  93.     type.
  94.  
  95.     The default option is for use inside a desktop session only. It is not
  96.     recommended to use xdg-mime default as root.
  97.  
  98. install
  99.     Adds the file type descriptions provided in mimetypes-file to the desktop
  100.     environment. mimetypes-file must be a XML file that follows the
  101.     freedesktop.org Shared MIME-info Database specification and that has a
  102.     mime-info element as its document root. For each new file type one or more
  103.     icons with name major-minor must be installed with the xdg-icon-resource
  104.     command in the mimetypes context. For example the application/
  105.     vnd.oasis.opendocument.text filetype requires an icon by the name of
  106.     application-vnd.oasis.opendocument.text to be installed.
  107. uninstall
  108.     Removes the file type descriptions provided in mimetypes-file and
  109.     previously added with xdg-mime install from the desktop environment.
  110.     mimetypes-file must be a XML file that follows the freedesktop.org Shared
  111.     MIME-info Database specification and that has a mime-info element as its
  112.     document root.
  113.  
  114. Options
  115.  
  116. --mode mode
  117.  
  118.     mode can be user or system. In user mode the file is (un)installed for the
  119.     current user only. In system mode the file is (un)installed for all users
  120.     on the system. Usually only root is allowed to install in system mode.
  121.  
  122.     The default is to use system mode when called by root and to use user mode
  123.     when called by a non-root user.
  124.  
  125. --novendor
  126.  
  127.     Normally, xdg-mime checks to ensure that the mimetypes-file to be installed
  128.     has a proper vendor prefix. This option can be used to disable that check.
  129.  
  130.     A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated
  131.     with a dash ("-"). Companies and organizations are encouraged to use a word
  132.     or phrase, preferably the organizations name, for which they hold a
  133.     trademark as their vendor prefix. The purpose of the vendor prefix is to
  134.     prevent name conflicts.
  135.  
  136. --help
  137.     Show command synopsis.
  138. --manual
  139.     Show this manualpage.
  140. --version
  141.     Show the xdg-utils version information.
  142.  
  143. Environment Variables
  144.  
  145. xdg-mime honours the following environment variables:
  146.  
  147. XDG_UTILS_DEBUG_LEVEL
  148.     Setting this environment variable to a non-zero numerical value makes
  149.     xdg-mime do more verbose reporting on stderr. Setting a higher value
  150.     increases the verbosity.
  151. XDG_UTILS_INSTALL_MODE
  152.     This environment variable can be used by the user or administrator to
  153.     override the installation mode. Valid values are user and system.
  154.  
  155. Exit Codes
  156.  
  157. An exit code of 0 indicates success while a non-zero exit code indicates
  158. failure. The following failure codes can be returned:
  159.  
  160. 1
  161.     Error in command line syntax.
  162. 2
  163.     One of the files passed on the command line did not exist.
  164. 3
  165.     A required tool could not be found.
  166. 4
  167.     The action failed.
  168. 5
  169.     No permission to read one of the files passed on the command line.
  170.  
  171. See Also
  172.  
  173. xdg-icon-resource(1), xdg-desktop-menu(1)
  174.  
  175. Examples
  176.  
  177. xdg-mime query filetype /tmp/foobar.png
  178.  
  179. Prints the MIME type of the file /tmp/foobar.png, in this case image/png
  180.  
  181. xdg-mime query default image/png
  182.  
  183. Prints the .desktop filename of the application which is registered to open PNG
  184. files.
  185.  
  186. xdg-mime install shinythings-shiny.xml
  187.  
  188. Adds a file type description for "shiny"-files. "shinythings-" is used as the
  189. vendor prefix. The file type description could look as folows.
  190.  
  191. shinythings-shiny.xml:
  192.  
  193. <?xml version="1.0"?>
  194. <mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
  195.   <mime-type type="text/x-shiny">
  196.     <comment>Shiny new file type</comment>
  197.     <glob pattern="*.shiny"/>
  198.     <glob pattern="*.shi"/>
  199.   </mime-type>
  200. </mime-info>
  201.  
  202. An icon for this new file type must also be installed, for example with:
  203.  
  204. xdg-icon-resource install --context mimetypes --size 64 shiny-file-icon.png text-x-shiny
  205.  
  206. _MANUALPAGE
  207. }
  208.  
  209. usage()
  210. {
  211. cat << _USAGE
  212. xdg-mime - command line tool for querying information about file type handling
  213. and adding descriptions for new file types
  214.  
  215. Synopsis
  216.  
  217. xdg-mime query { filetype | default } ...
  218.  
  219. xdg-mime default application mimetype(s)
  220.  
  221. xdg-mime install [--mode mode] [--novendor] mimetypes-file
  222.  
  223. xdg-mime uninstall [--mode mode] mimetypes-file
  224.  
  225. xdg-mime { --help | --manual | --version }
  226.  
  227. _USAGE
  228. }
  229.  
  230. #@xdg-utils-common@
  231.  
  232. #----------------------------------------------------------------------------
  233. #   Common utility functions included in all XDG wrapper scripts
  234. #----------------------------------------------------------------------------
  235.  
  236. DEBUG()
  237. {
  238.   [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0;
  239.   [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0;
  240.   shift
  241.   echo "$@" >&2
  242. }
  243.  
  244. #-------------------------------------------------------------
  245. # Exit script on successfully completing the desired operation
  246.  
  247. exit_success()
  248. {
  249.     if [ $# -gt 0 ]; then
  250.         echo "$@"
  251.         echo
  252.     fi
  253.  
  254.     exit 0
  255. }
  256.  
  257.  
  258. #-----------------------------------------
  259. # Exit script on malformed arguments, not enough arguments
  260. # or missing required option.
  261. # prints usage information
  262.  
  263. exit_failure_syntax()
  264. {
  265.     if [ $# -gt 0 ]; then
  266.         echo "xdg-mime: $@" >&2
  267.         echo "Try 'xdg-mime --help' for more information." >&2
  268.     else
  269.         usage
  270.         echo "Use 'man xdg-mime' or 'xdg-mime --manual' for additional info."
  271.     fi
  272.  
  273.     exit 1
  274. }
  275.  
  276. #-------------------------------------------------------------
  277. # Exit script on missing file specified on command line
  278.  
  279. exit_failure_file_missing()
  280. {
  281.     if [ $# -gt 0 ]; then
  282.         echo "xdg-mime: $@" >&2
  283.     fi
  284.  
  285.     exit 2
  286. }
  287.  
  288. #-------------------------------------------------------------
  289. # Exit script on failure to locate necessary tool applications
  290.  
  291. exit_failure_operation_impossible()
  292. {
  293.     if [ $# -gt 0 ]; then
  294.         echo "xdg-mime: $@" >&2
  295.     fi
  296.  
  297.     exit 3
  298. }
  299.  
  300. #-------------------------------------------------------------
  301. # Exit script on failure returned by a tool application
  302.  
  303. exit_failure_operation_failed()
  304. {
  305.     if [ $# -gt 0 ]; then
  306.         echo "xdg-mime: $@" >&2
  307.     fi
  308.  
  309.     exit 4
  310. }
  311.  
  312. #------------------------------------------------------------
  313. # Exit script on insufficient permission to read a specified file
  314.  
  315. exit_failure_file_permission_read()
  316. {
  317.     if [ $# -gt 0 ]; then
  318.         echo "xdg-mime: $@" >&2
  319.     fi
  320.  
  321.     exit 5
  322. }
  323.  
  324. #------------------------------------------------------------
  325. # Exit script on insufficient permission to read a specified file
  326.  
  327. exit_failure_file_permission_write()
  328. {
  329.     if [ $# -gt 0 ]; then
  330.         echo "xdg-mime: $@" >&2
  331.     fi
  332.  
  333.     exit 6
  334. }
  335.  
  336. check_input_file()
  337. {
  338.     if [ ! -e "$1" ]; then
  339.         exit_failure_file_missing "file '$1' does not exist"
  340.     fi
  341.     if [ ! -r "$1" ]; then
  342.         exit_failure_file_permission_read "no permission to read file '$1'"
  343.     fi
  344. }
  345.  
  346. check_vendor_prefix()
  347. {
  348.     file_label="$2"
  349.     [ -n "$file_label" ] || file_label="filename"
  350.     file=`basename "$1"`
  351.     case "$file" in
  352.        [a-zA-Z]*-*)
  353.          return
  354.          ;;
  355.     esac
  356.  
  357.     echo "xdg-mime: $file_label '$file' does not have a proper vendor prefix" >&2
  358.     echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2
  359.     echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2
  360.     echo "Use --novendor to override or 'xdg-mime --manual' for additional info." >&2
  361.     exit 1
  362. }
  363.  
  364. check_output_file()
  365. {
  366.     # if the file exists, check if it is writeable
  367.     # if it does not exists, check if we are allowed to write on the directory
  368.     if [ -e "$1" ]; then
  369.         if [ ! -w "$1" ]; then
  370.             exit_failure_file_permission_write "no permission to write to file '$1'"
  371.         fi
  372.     else
  373.         DIR=`dirname "$1"`
  374.         if [ ! -w "$DIR" -o ! -x "$DIR" ]; then
  375.             exit_failure_file_permission_write "no permission to create file '$1'"
  376.         fi
  377.     fi
  378. }
  379.  
  380. #----------------------------------------
  381. # Checks for shared commands, e.g. --help
  382.  
  383. check_common_commands()
  384. {
  385.     while [ $# -gt 0 ] ; do
  386.         parm="$1"
  387.         shift
  388.  
  389.         case "$parm" in
  390.             --help)
  391.             usage
  392.             echo "Use 'man xdg-mime' or 'xdg-mime --manual' for additional info."
  393.             exit_success
  394.             ;;
  395.  
  396.             --manual)
  397.             manualpage
  398.             exit_success
  399.             ;;
  400.  
  401.             --version)
  402.             echo "xdg-mime 1.0.1"
  403.             exit_success
  404.             ;;
  405.         esac
  406.     done
  407. }
  408.  
  409. check_common_commands "$@"
  410.  
  411. [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL;
  412. if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then
  413.     # Be silent
  414.     xdg_redirect_output=" > /dev/null 2> /dev/null"
  415. else
  416.     # All output to stderr
  417.     xdg_redirect_output=" >&2"
  418. fi
  419.  
  420. #--------------------------------------
  421. # Checks for known desktop environments
  422. # set variable DE to the desktop environments name, lowercase
  423.  
  424. detectDE()
  425. {
  426.     if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde;
  427.     elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
  428.     elif xprop -root _DT_SAVE_MODE | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
  429.     fi
  430. }
  431.  
  432. #----------------------------------------------------------------------------
  433. # kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4
  434. # It also always returns 1 in KDE 3.4 and earlier
  435. # Simply return 0 in such case
  436.  
  437. kfmclient_fix_exit_code()
  438. {
  439.     version=`kde-config --version 2>/dev/null | grep KDE`
  440.     major=`echo $version | sed 's/KDE: \([0-9]\).*/\1/'`
  441.     minor=`echo $version | sed 's/KDE: [0-9]*\.\([0-9]\).*/\1/'`
  442.     release=`echo $version | sed 's/KDE: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'`
  443.     test "$major" -gt 3 && return $1
  444.     test "$minor" -gt 5 && return $1
  445.     test "$release" -gt 4 && return $1
  446.     return 0
  447. }
  448.  
  449. update_mime_database()
  450. {
  451.    if [ x"$mode" = x"user" -a -n "$DISPLAY" ] ; then
  452.       detectDE
  453.       if [ x"$DE" = x"kde" ] ; then
  454.          DEBUG 1 "Running kbuildsycoca"
  455.          eval 'kbuildsycoca'$xdg_redirect_output
  456.       fi
  457.    fi
  458.    for x in `echo "$PATH:/opt/gnome/bin" | sed 's/:/ /g'`; do
  459.       if [ -x $x/update-mime-database ] ; then
  460.          DEBUG 1 "Running $x/update-mime-database $1"
  461.          eval '$x/update-mime-database $1'$xdg_redirect_output
  462.          return
  463.       fi
  464.    done
  465. }
  466.  
  467. info_kde()
  468. {
  469.     DEBUG 1 "Running kfile \"$1\""
  470.     kfile "$1" 2> /dev/null | head -n 1 | cut -d "(" -f 2 | cut -d ")" -f 1
  471.  
  472.     if [ $? -eq 0 ]; then
  473.         exit_success
  474.     else
  475.         exit_failure_operation_failed
  476.     fi
  477. }
  478.  
  479. info_gnome()
  480. {
  481.     file=`readlink -f "$1"` # Normalize path
  482.     DEBUG 1 "Running gnomevfs-info \"$file\""
  483.     gnomevfs-info "$file" 2> /dev/null | grep MIME | cut -d ":" -f 2 | sed s/"^ "//
  484.  
  485.     if [ $? -eq 0 ]; then
  486.         exit_success
  487.     else
  488.         exit_failure_operation_failed
  489.     fi
  490. }
  491.  
  492. info_generic()
  493. {
  494.     DEBUG 1 "Running /usr/bin/file -i \"$1\"" 
  495.     /usr/bin/file -i "$1" 2> /dev/null | cut -d ":" -f 2 | sed s/"^ "//
  496.  
  497.     if [ $? -eq 0 ]; then
  498.         exit_success
  499.     else
  500.         exit_failure_operation_failed
  501.     fi
  502. }
  503.  
  504. make_default_kde()
  505. {
  506.     # $1 is vendor-name.desktop
  507.     # $2 is mime/type 
  508.     # Add to $KDE_HOME/share/config/profilerc:
  509.     # [$2 - 1]
  510.     # Application=$1
  511.     #
  512.     # Remove all [$2 - *] sections, or even better,
  513.     # renumber [$2 - *] sections and remove duplicate
  514.     
  515.     default_file="$HOME/.kde/share/config/profilerc"
  516.     DEBUG 2 "make_default_kde $1 $2"
  517.     DEBUG 1 "Updating $default_file"
  518.     mkdir -p "$HOME/.kde/share/config"
  519.     [ -f $default_file ] || touch $default_file
  520.     awk -v application="$1" -v mimetype="$2" '
  521.     BEGIN {
  522.         header_start="[" mimetype " - "
  523.         supress=0
  524.     }
  525.     {  
  526.         if (index($0, header_start) == 1 )
  527.             supress=1
  528.         else
  529.             if (/^\[/) { supress=0 }
  530.  
  531.         if (!supress) {
  532.             print $0
  533.         }
  534.     }
  535.     END {
  536.         print "" 
  537.         print "[" mimetype " - 1]"
  538.         print "Application=" application
  539.         print "AllowAsDefault=true"
  540.         print "GenericServiceType=Application"
  541.         print "Preference=1"
  542.         print "ServiceType=" mimetype
  543.     }
  544. ' $default_file > ${default_file}.new && mv ${default_file}.new $default_file
  545. }
  546.  
  547. make_default_generic()
  548. {
  549.     # $1 is vendor-name.desktop
  550.     # $2 is mime/type 
  551.     # Add $2=$1 to XDG_DATA_HOME/applications/defaults.list
  552.     xdg_user_dir="$XDG_DATA_HOME"
  553.     [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"
  554.     default_file="$xdg_user_dir/applications/defaults.list"
  555.     DEBUG 2 "make_default_generic $1 $2"
  556.     DEBUG 1 "Updating $default_file"
  557.     grep -v "$2=" $default_file > ${default_file}.new 2> /dev/null
  558.     if ! grep "[Default Applications]" ${default_file}.new > /dev/null; then
  559.        echo "[Default Applications]" >> ${default_file}.new
  560.     fi
  561.     echo $2=$1 >> ${default_file}.new
  562.     mv ${default_file}.new $default_file
  563. }
  564.  
  565. defapp_generic()
  566. {
  567.     MIME="$1"
  568.     xdg_user_dir="$XDG_DATA_HOME"
  569.     [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"
  570.     xdg_user_dir="$xdg_user_dir/$xdg_dir_name"
  571.     xdg_system_dirs="$XDG_DATA_DIRS"
  572.     [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/
  573.  
  574.     for x in `echo "$xdg_user_dir:$xdg_system_dirs" | sed 's/:/ /g'`; do
  575.        DEBUG 2 "Checking $x/applications/defaults.list"
  576.        trader_result=`grep "$MIME=" $x/applications/defaults.list 2> /dev/null | cut -d '=' -f 2 | cut -d ';' -f 1`
  577.        if [ -n "$trader_result" ] ; then
  578.           echo $trader_result
  579.           exit_success
  580.        fi
  581.     done
  582.     exit_success
  583. }
  584.  
  585. defapp_kde()
  586. {
  587.     MIME="$1"
  588.     ktradertest=`which ktradertest 2> /dev/null`
  589.     if [ -n "$ktradertest" ] ; then
  590.         DEBUG 1 "Running ktradertest \"$MIME\" Application"
  591.         trader_result=`ktradertest "$MIME" Application 2>/dev/null | grep DesktopEntryPath \
  592.             | head -n 1 | cut -d ':' -f 2 | cut -d \' -f 2`
  593.         if [ -n "$trader_result" ] ; then
  594.             basename "$trader_result"
  595.             exit_success
  596.         else
  597.             exit_failure_operation_failed
  598.         fi
  599.     else
  600.         defapp_generic "$1"
  601.     fi
  602. }
  603.  
  604. [ x"$1" != x"" ] || exit_failure_syntax
  605.  
  606. mode=
  607. action=
  608. filename=
  609. mimetype=
  610.  
  611. case $1 in
  612.   install)
  613.     action=install
  614.     ;;
  615.  
  616.   uninstall)
  617.     action=uninstall
  618.     ;;
  619.  
  620.   query)
  621.     shift
  622.  
  623.     if [ -z "$1" ] ; then 
  624.         exit_failure_syntax "query type argument missing"
  625.     fi
  626.     
  627.     case $1 in
  628.       filetype)
  629.         action=info
  630.  
  631.         filename="$2"
  632.         if [ -z "$filename" ] ; then 
  633.             exit_failure_syntax "FILE argument missing"
  634.         fi
  635.         case $filename in
  636.           -*)
  637.             exit_failure_syntax "unexpected option '$filename'"
  638.             ;;
  639.         esac
  640.         check_input_file "$filename"
  641.         ;;
  642.  
  643.       default)
  644.         action=defapp
  645.         mimetype="$2"
  646.         if [ -z "$mimetype" ] ; then 
  647.             exit_failure_syntax "mimetype argument missing"
  648.         fi
  649.         case $mimetype in
  650.           -*)
  651.             exit_failure_syntax "unexpected option '$mimetype'"
  652.             ;;
  653.  
  654.           */*)
  655.             # Ok
  656.             ;;
  657.  
  658.           *)
  659.             exit_failure_syntax "mimetype '$mimetype' is not in the form 'minor/major'"
  660.             ;;
  661.         esac
  662.         ;;
  663.  
  664.       *)
  665.       exit_failure_syntax "unknown query type '$1'"
  666.       ;;
  667.     esac
  668.     ;;
  669.  
  670.   default)
  671.     action=makedefault
  672.     shift
  673.  
  674.     if [ -z "$1" ] ; then 
  675.         exit_failure_syntax "application argument missing"
  676.     fi
  677.     case $1 in
  678.       -*)
  679.         exit_failure_syntax "unexpected option '$1'"
  680.         ;;
  681.  
  682.       *.desktop)
  683.         filename="$1"
  684.         ;;
  685.  
  686.       *)
  687.         exit_failure_syntax "malformed argument '$1', expected *.desktop"
  688.         ;;
  689.     esac
  690.     ;;
  691.  
  692.   *)
  693.   exit_failure_syntax "unknown command '$1'"
  694.   ;;
  695. esac
  696.  
  697. shift
  698.  
  699.  
  700. if [ "$action" = "makedefault" ]; then
  701.     if [ -z "$1" ] ; then 
  702.         exit_failure_syntax "mimetype argument missing"
  703.     fi
  704.  
  705.     while [ $# -gt 0 ] ; do
  706.         case $1 in
  707.           -*)
  708.             exit_failure_syntax "unexpected option '$1'"
  709.             ;;
  710.         esac
  711.         mimetype="$1"
  712.         shift
  713.         
  714.         make_default_kde "$filename" "$mimetype"
  715.         make_default_generic "$filename" "$mimetype"
  716.     done
  717.     exit_success
  718. fi
  719.  
  720. if [ "$action" = "info" ]; then
  721.     detectDE
  722.  
  723.     if [ x"$DE" = x"" ]; then
  724.         if [ -x /usr/bin/file ]; then
  725.             DE=generic
  726.         fi
  727.     fi
  728.  
  729.     case "$DE" in
  730.         kde)
  731.         info_kde "$filename"
  732.         ;;
  733.  
  734.         gnome)
  735.         info_gnome "$filename"
  736.         ;;
  737.  
  738.         *)
  739.         info_generic "$filename"
  740.         ;;
  741.     esac
  742.     exit_failure_operation_impossible "no method available for quering MIME type of '$filename'"
  743. fi
  744.  
  745. if [ "$action" = "defapp" ]; then
  746.     detectDE
  747.  
  748.     case "$DE" in
  749.         kde)
  750.         defapp_kde "$mimetype"
  751.         ;;
  752.  
  753.         *)
  754.         defapp_generic "$mimetype"
  755.         ;;
  756.     esac
  757.     exit_failure_operation_impossible "no method available for quering default application for '$mimetype'"
  758. fi
  759.  
  760. vendor=true
  761. while [ $# -gt 0 ] ; do
  762.     parm="$1"
  763.     shift
  764.  
  765.     case $parm in
  766.       --mode)
  767.         if [ -z "$1" ] ; then
  768.             exit_failure_syntax "mode argument missing for --mode"
  769.         fi
  770.         case "$1" in
  771.           user)
  772.             mode="user"
  773.             ;;
  774.  
  775.           system)
  776.             mode="system"
  777.             ;;
  778.             
  779.           *)
  780.             exit_failure_syntax "unknown mode '$1'"
  781.             ;;
  782.         esac
  783.         shift
  784.         ;;
  785.  
  786.       --novendor)
  787.         vendor=false
  788.         ;;
  789.  
  790.       -*)
  791.         exit_failure_syntax "unexpected option '$parm'"
  792.         ;;
  793.  
  794.       *)
  795.         if [ -n "$filename" ] ; then
  796.             exit_failure_syntax "unexpected argument '$parm'"
  797.         fi
  798.  
  799.         filename="$parm"
  800.         check_input_file "$filename"
  801.         ;;
  802.     esac
  803. done
  804.  
  805. if [ -z "$action" ] ; then
  806.     exit_failure_syntax "command argument missing"
  807. fi
  808.  
  809. if [ -n "$XDG_UTILS_INSTALL_MODE" ] ; then
  810.     if [ "$XDG_UTILS_INSTALL_MODE" = "system" ] ; then
  811.         mode="system"
  812.     elif [ "$XDG_UTILS_INSTALL_MODE" = "user" ] ; then
  813.         mode="user"
  814.     fi
  815. fi
  816.  
  817. if [ -z "$mode" ] ; then
  818.     if [ `whoami` = "root" ] ; then
  819.         mode="system"
  820.     else
  821.         mode="user"
  822.     fi
  823. fi
  824.  
  825. if [ -z "$filename" ] ; then
  826.     exit_failure_syntax "mimetypes-file argument missing"
  827. fi
  828.  
  829. if [ "$vendor" =  "true" -a "$action" = "install" ] ; then
  830.     check_vendor_prefix "$filename"
  831. fi
  832.  
  833. xdg_base_dir=
  834. xdg_dir_name=mime/packages/
  835.  
  836. xdg_user_dir="$XDG_DATA_HOME"
  837. [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"
  838. [ x"$mode" = x"user" ] && xdg_base_dir="$xdg_user_dir/mime"
  839. xdg_user_dir="$xdg_user_dir/$xdg_dir_name"
  840.  
  841. xdg_system_dirs="$XDG_DATA_DIRS"
  842. [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/
  843. for x in `echo $xdg_system_dirs | sed 's/:/ /g'`; do
  844.     if [ -w $x/$xdg_dir_name ] ; then
  845.         [ x"$mode" = x"system" ] && xdg_base_dir="$x/mime"
  846.         xdg_global_dir="$x/$xdg_dir_name"
  847.         break
  848.     fi
  849. done
  850. [ -w $xdg_global_dir ] || xdg_global_dir=
  851. DEBUG 3 "xdg_user_dir: $xdg_user_dir"
  852. DEBUG 3 "xdg_global_dir: $xdg_global_dir"
  853.  
  854. # Find KDE3 mimelnk directory
  855. kde_user_dir=
  856. kde_global_dir=
  857. kde_global_dirs=`kde-config --path mime 2> /dev/null`
  858. DEBUG 3 "kde_global_dirs: $kde_global_dirs"
  859. first=
  860. for x in `echo $kde_global_dirs | sed 's/:/ /g'` ; do
  861.     if [ -z "$first" ] ; then
  862.         first=false
  863.         kde_user_dir="$x"
  864.     elif [ -w $x ] ; then
  865.         kde_global_dir="$x"
  866.     fi
  867. done
  868. DEBUG 3 "kde_user_dir: $kde_user_dir"
  869. DEBUG 3 "kde_global_dir: $kde_global_dir"
  870.  
  871. # TODO: Gnome legacy support
  872. # See http://forums.fedoraforum.org/showthread.php?t=26875
  873. gnome_user_dir="$HOME/.gnome/apps"
  874. gnome_global_dir=/usr/share/gnome/apps
  875. [ -w $gnome_global_dir ] || gnome_global_dir=
  876. DEBUG 3 "gnome_user_dir: $gnome_user_dir"
  877. DEBUG 3 "gnome_global_dir: $gnome_global_dir"
  878.  
  879. if [ x"$mode" = x"user" ] ; then
  880.     xdg_dir="$xdg_user_dir"
  881.     kde_dir="$kde_user_dir"
  882.     gnome_dir="$gnome_user_dir"
  883.     my_umask=077
  884. else
  885.     xdg_dir="$xdg_global_dir"
  886.     kde_dir="$kde_global_dir"
  887.     gnome_dir="$gnome_global_dir"
  888.     my_umask=022
  889.     if [ -z "${xdg_dir}${kde_dir}${gnome_dir}" ] ; then
  890.         exit_failure_operation_impossible "No writable system mimetype directory found."
  891.     fi
  892. fi
  893.  
  894. # echo "[xdg|$xdg_user_dir|$xdg_global_dir]"
  895. # echo "[kde|$kde_user_dir|$kde_global_dir]"
  896. # echo "[gnome|$gnome_user_dir|$gnome_global_dir]"
  897. # echo "[using|$xdg_dir|$kde_dir|$gnome_dir]"
  898.  
  899. basefile=`basename "$filename"`
  900. #[ -z $vendor ] || basefile="$vendor-$basefile"
  901.  
  902. mimetypes=
  903. if [ -n "$kde_dir" ] ; then
  904.     DEBUG 2 "KDE3 mimelnk directory found, extracting mimetypes from XML file"
  905.  
  906.     mimetypes=`awk < "$filename" '
  907. # Strip XML comments
  908. BEGIN {
  909.  supress=0
  910. }
  911. {
  912.  do 
  913.     if (supress) {
  914.        if (match($0,/-->/)) {
  915.            $0=substr($0,RSTART+RLENGTH)
  916.            supress=0
  917.        }
  918.        else {
  919.            break
  920.        }
  921.     }
  922.     else {
  923.        if (match($0,/<!--/)) {
  924.            if (RSTART>1) print substr($0,0,RSTART)
  925.            $0=substr($0,RSTART+RLENGTH)
  926.            supress=1
  927.        }
  928.        else {
  929.            if ($0) print $0
  930.            break
  931.        }
  932.     }
  933.  while(1)
  934. }
  935. ' | awk '
  936. # List MIME types listed in <mime-type> tags
  937. BEGIN {
  938.   RS="<"
  939. }
  940. /^mime-info/, /^\/mime-info/ {
  941.   if (match($0,/^mime-type/)) {
  942.     if (match($0,/type="[^"]*/) || match($0,/type='"'"'[^'"'"']*/)) {
  943.       print substr($0,RSTART+6,RLENGTH-6)
  944.     }
  945.   }
  946. }'`
  947. fi  
  948.  
  949. DEBUG 1 "$action mimetype in $xdg_dir"
  950.  
  951. case $action in
  952.     install)
  953.         save_umask=`umask`
  954.         umask $my_umask
  955.  
  956.         for x in $xdg_dir ; do
  957.             mkdir -p $x
  958.             eval 'cp $filename $x/$basefile'$xdg_redirect_output
  959.         done
  960.  
  961.         if [ -n "$mimetypes" ] ; then
  962.             # No quotes around $mimetypes
  963.             for x in $mimetypes ; do 
  964.                 DEBUG 1 "Installing $kde_dir/$x.desktop (KDE 3.x support)"
  965.                 mkdir -p `dirname $kde_dir/$x.desktop`
  966.                 awk < "$filename" '
  967. # Strip XML comments
  968. BEGIN {
  969.  supress=0
  970. }
  971. {
  972.  do 
  973.     if (supress) {
  974.        if (match($0,/-->/)) {
  975.            $0=substr($0,RSTART+RLENGTH)
  976.            supress=0
  977.        }
  978.        else {
  979.            break
  980.        }
  981.     }
  982.     else {
  983.        if (match($0,/<!--/)) {
  984.            if (RSTART>1) print substr($0,0,RSTART)
  985.            $0=substr($0,RSTART+RLENGTH)
  986.            supress=1
  987.        }
  988.        else {
  989.            if ($0) print $0
  990.            break
  991.        }
  992.     }
  993.  while(1)
  994. }
  995. ' | awk > $kde_dir/$x.desktop '
  996. # Extract mimetype $x from the XML file $filename
  997. # Note that bash requires us to escape a single quote as '"'"' 
  998. BEGIN {
  999.   the_type=ARGV[1]
  1000.   the_source=ARGV[2]
  1001.   ARGC=1
  1002.   RS="<"
  1003.   found=0
  1004.   glob_patterns=""
  1005. }
  1006. /^mime-info/, /^\/mime-info/ {
  1007.   if (match($0,/^mime-type/)) {
  1008.     if (match($0,/type="[^"]*/) || match($0,/type='"'"'[^'"'"']*/)) {
  1009.       if (substr($0,RSTART+6,RLENGTH-6) == the_type) {
  1010.         found=1
  1011.         print "[Desktop Entry]"
  1012.         print "# Installed by xdg-mime from " the_source
  1013.         print "Type=MimeType"
  1014.         print "MimeType=" the_type
  1015.         the_icon=the_type
  1016.         sub("/", "-", the_icon)
  1017.         print "Icon=" the_icon 
  1018.       }
  1019.     }
  1020.   }
  1021.   else if (found) {
  1022.     if (match($0,/^\/mime-type/)) {
  1023.       if (glob_patterns)
  1024.          print "Patterns=" glob_patterns
  1025.       exit 0
  1026.     }
  1027.  
  1028.     if (match($0,/^sub-class-of/)) {
  1029.       if (match($0,/type="[^"]*/) || match($0,/type='"'"'[^'"'"']*/)) {    
  1030.         print "X-KDE-IsAlso=" substr($0,RSTART+6,RLENGTH-6)
  1031.       }
  1032.       else {
  1033.         print "Error: '"'"'type'"'"' argument missing in " RS $0
  1034.         exit 1 
  1035.       }
  1036.     }
  1037.     if (match($0,/^glob/)) {
  1038.       if (match($0,/pattern="[^"]*/) || match($0,/pattern='"'"'[^'"'"']*/)) {    
  1039.         glob_patterns = glob_patterns substr($0,RSTART+9,RLENGTH-9) ";"
  1040.       }
  1041.       else {
  1042.         print "Error: '"'"'pattern'"'"' argument missing in " RS $0
  1043.         exit 1 
  1044.       }
  1045.     }
  1046.     if (match($0,/^comment/)) {
  1047.       if (match($0,/xml:lang="[^"]*/) || match($0,/xml:lang='"'"'[^'"'"']*/)) {    
  1048.         lang=substr($0,RSTART+10,RLENGTH-10)
  1049.       }
  1050.       else {
  1051.         lang=""
  1052.       }
  1053.       if (match($0,/>/)) {
  1054.         comment=substr($0,RSTART+1)
  1055.         sub("<", "<", comment)
  1056.         sub(">", ">", comment)
  1057.         sub("&", "\\&", comment)
  1058.         if (lang)
  1059.            print "Comment[" lang "]=" comment
  1060.         else
  1061.            print "Comment=" comment
  1062.       }
  1063.     }
  1064.   }
  1065. }
  1066. END {
  1067.   if (!found) {
  1068.     print "Error: Mimetype '"'"'" the_type "'"'"' not found"
  1069.     exit 1
  1070.   }
  1071. }
  1072. ' $x $basefile
  1073.                 if [ "$?" = "1" ] ; then
  1074.                     grep -A 10 "^Error:" $kde_dir/$x.desktop >&2
  1075.                     rm $kde_dir/$x.desktop
  1076.                     exit 1  
  1077.                 fi
  1078.             done
  1079.         fi
  1080.  
  1081.         umask $save_umask
  1082.         ;;
  1083.  
  1084.     uninstall)
  1085.         for x in $xdg_dir ; do
  1086.             rm -f $x/$basefile
  1087.         done
  1088.  
  1089.         # No quotes around $mimetypes
  1090.         for x in $mimetypes ; do 
  1091.             if grep '^# Installed by xdg-mime' $kde_dir/$x.desktop >/dev/null 2>&1; then
  1092.                 DEBUG 1 "Removing $kde_dir/$x.desktop (KDE 3.x support)"
  1093.                 rm -f $kde_dir/$x.desktop
  1094.             fi
  1095.         done
  1096.         ;;
  1097. esac
  1098.  
  1099. update_mime_database $xdg_base_dir
  1100.  
  1101. exit_success
  1102.  
  1103.